#include <bits/stdc++.h>
#include <pthread.h>//linux 使用线程，需要 -lpthread
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>

using namespace std;
__thread int g_val =100;//可以让线程局部存储。注意，这个只能存内类型，因为是种编译选项
//这个是很有用，但是也有坑


void *ThreadRoutine(void* arg)
{
    pthread_detach(pthread_self());//设置线程分离状态就不能再被主线程join了
    pid_t tid = syscall(SYS_gettid);//获取使用gettid的系统调用,获取的是LWD
    const char* threadname = (const char* )arg;
    int cnt = 100;
    while(cnt)
    {
        cout<<"I am a new Thread :"<<threadname<<"pid :"<<getpid()<<"LWD:"<<tid<<"\n";
        sleep(1);
    }
    return (void*)("Thread 1 done");//当然也可以返回一个对象的指针s
    // pthread_exit((void*)("Thread 1 done"));  和return 差不多
}

int main()
{ 
    pthread_t tid;
    pthread_create(&tid,nullptr,ThreadRoutine,(void*)("Thread 1"));
    
    // pthread_detach(tid);//也可以主线程设置该线程设置成分离
    // // 一般用于主线程不关心起执行结果
 
    //主线程主动取消线程
    sleep(3);
    std::cout<<"主线程取消线程\n"; 
    int t = pthread_cancel(tid);
    std::cout<<t<<"\n";  

    sleep(3);
    //主线程回收线程
    //放出线程取消的代码，我们发现join失败
    //说明取消了的线程是不能被join的。
    //因为取消之后，就有系统来管理了
    void* re = nullptr;
    PTHREAD_CANCELED;
    int n = pthread_join(tid,&re);
    std::cout<<"main thread join done,\nn:  "<<n<<"thread return :"<<re<<"\n";


    return 0;
}